#ifndef TOOLS_H
#define TOOLS_H

// Pour la définition des CVertexO
#include <common/interfaces.h>

#include "../inc/Circle.h"
#include <vcg/complex/algorithms/create/platonic.h>
#include <vector>

/*!
 *  \brief Fonction de comparaison pour trier un ensemble de sommets selon leur altitude.
 *
 *  Compare deux sommets selon leur altitude.
 *
 *  \param _v1 : premier sommet.
 *  \param _v2 : second sommey.
 *  \return : booleen.
 */
bool compareVertByAltitude(CVertexO* _v1, CVertexO* _v2);

/*!
 *  \brief Produit scalaire.
 *
 *  Calcule le produit scalaire de deux vecteurs représentés par des objets de type Point.
 *
 *  \param _p1 : premier vecteur.
 *  \param _p2 : second vecteur.
 *  \return : résultat du produit scalaire.
 */
float scalarProduct2D ( CVertexO _p1, CVertexO _p2 );

/*!
 *  \brief Différence entre deux points.
 *
 *  Calcule la différence entre deux Points.
 *
 *  \param _p1 : premier point.
 *  \param _p2 : second point.
 *  \return : résultat de la différence.
 */
CVertexO diffPoint ( CVertexO _p1, CVertexO _p2 );

void saveCircles( std::vector<Circle> _circles, const QString& _fileName );

inline float distPoint ( vcg::Point3f _p, float _x, float _y, float _z ) { return sqrt( (_p[0] - _x)*(_p[0] - _x) + (_p[1] - _y)*(_p[1] - _y) + (_p[2] - _z)*(_p[2] - _z));}

/*!
 *  \brief Crée un layer représentant des vecteurs.
 *
 *  Crée un maillage représentant un ensemble de normales.
 *
 *  \param _parent : parent du mesh à créer.
 *  \param _mesh : maillage original.
 *  \return : maillage représentant les normales.
 */
MeshModel* createNormalsLayer ( MeshDocument& _parent, CMeshO& _mesh );

/*!
 *  \brief Ajoute des cercles à un layer.
 *
 *  Ajoute à un maillage des cercles correspondants à une case de l'espace de hough.
 *
 *  \param _circlesMesh : mesh auquel on ajoute le cercle.
 *  \param _a : coordonnée x du centre du cercle.
 *  \param _b : coordonnée y du centre du cercle.
 *  \param _c : coordonnée z du centre du cercle.
 *  \param _r : rayon du cercle.
 *  \param _nbSections : nombre de sections utilisées pour tracer le cercle.
 *  \return : void.
 */
void addCircleToLayer ( CMeshO& _circlesMesh, vcg::Point3f _vector, float _a, float _b, float _c, float _r, int _nbSections);

void addCircleToLayer ( CMeshO& _circlesMesh, Circle _c , int _nbSections);

void addCircleToLayer2 ( CMeshO& _circlesMesh, Circle _c , int _nbSections, float zmin, float zmax, int score );

/*!
 *  \brief Projection d'un nuage de points dans un plan
 *
 *  Crée un maillage contenant la projection d'un nuage de points selon une direction donnée par un vecteur.
 *
 *  \param _parent : parent du mesh à créer.
 *  \param _inputMesh : nuage de points original.
 *  \param _vector : direction de la projection (normale du plan de projection).
 *  \return : maillage contenant le résultat de la projection.
 */
MeshModel* createProjLayer (MeshDocument& _parent, MeshModel* _inputMesh, vcg::Point3f _vector);

void mirror ( int& _a, int& _b, int& _c, int& _d, int _maxA, int _maxB,int _maxC, int _maxD );

#endif // TOOLS_H
